package com.game.utils;

/**
 * 字节数组操作工具类.
 *
 * @author wh
 */
public class ByteArrayUtils {
    /**
     * 一个空的字节数组.
     */
    public static final byte[] EMPTY_BYTE_ARRAY = {};

    /**
     * 一个short类型的数字转化为2位byte数组
     *
     * @param a short类型的数字
     * @return byte数组
     */
    public static byte[] toByteArray(short a) {
        return new byte[]{(byte) ((a >> 8) & 0xFF), (byte) (a & 0xFF)};
    }

    /**
     * 一个int类型的数字转化为4位byte数组
     *
     * @param num int类型的数字
     * @return byte数组
     */
    public static byte[] toByteArray(int num) {
        return new byte[]{(byte) ((num >> 24) & 0xFF), (byte) ((num >> 16) & 0xFF), (byte) ((num >> 8) & 0xFF), (byte) (num & 0xFF)};
    }

    /**
     * 4位byte数组转化为一个int类型的数字
     *
     * @param bytes byte数组
     * @return int类型的数字
     */
    public static int toInt(byte[] bytes) {
        return bytes[3] & 0xFF | (bytes[2] & 0xFF) << 8 | (bytes[1] & 0xFF) << 16 | (bytes[0] & 0xFF) << 24;
    }

    /**
     * N位byte数组读出一个无符号short类型的数字
     *
     * @param bytes byte数组
     * @return short类型的数字
     */
    public static int toUnsignedShort(byte[] bytes) {
        return toUnsignedShort(bytes, 0);
    }

    /**
     * N位byte数组读出一个无符号short类型的数字
     *
     * @param bytes byte数组
     * @param off   偏移值
     * @return short类型的数字
     */
    public static int toUnsignedShort(byte[] bytes, int off) {
        return (bytes[off + 1] << 8 & 0xFF00) | (bytes[off] & 0xFF);
    }
}